代码混淆技术包括什么
代码混淆技术包括:
词法转换:词法转换算法是一类原理简单、实现容易的转换算法。程序的设计原则一般是要求对程序中用到的对象、函数与变量用易懂的方式进行命名,这样会给攻击者提供分析的资源和线索。词法变换的原理就是通过对函数和变量名称进行变换,使其违背见名知义的软件工程原则,从而达到增大攻击难度的目的。常用的变换规则有标识符交换、随机字符串替换等。
流程转换:流程转换算法是对程序的运行流程进行转换,使攻击者无法掌握程序真正的运行流程,从而达到混淆的目的。流程转换算法包括两个部分,一部分是设计不透明谓词,另一部分是设计改变程序流程的方法。流程转换算法关键在于不透明谓词的设计。不透明谓词是一种混淆者可知而攻击者却难以判断其值的结构。由于攻击者无法获知真实的原代码,通过不透明谓词这种结构,能方便、有效地构造转换算法来对程序的流程进行混淆。流程转换算法增加了程序的复杂度,其抵抗攻击的能力非常强,但同时带来的开销也很大。
静态数据动态生成:利用函数或子程序对静态数据进行动态生成的方式混淆,能增加程序复杂度。将需要混淆的静态数据利用函数或者子程序替代并分散嵌入各控制块后,算法的强度与弹性能大大提升。在应用中适当地选择混淆数据能有效增强算法的性能,可以防止对程序中所有静态数据混淆而增加开销,也不会造成仅对关键数据混淆而给攻击者提供有效提示。
数组结构转换:对数组的混淆方式包括将数组拆分为几个子数组、合并几个数组为一个、增加或减少数组的维度等。合并数组增加了程序的复杂度,拆分数组在合并数组的基础上还增加了复杂度,而改变数组维度在这两者之上还增加了复杂度。单独使用一种转换方式抵抗攻击的性能较弱,将上述方式有效组合能大大加强抵抗攻击的强度。
代码流混淆:通过改变代码的控制流程,改变了代码的方向。这意味着尽管最终结果是相同的,但要弄清楚代码为什么朝着某个方向或前进的方向要花费更多的时间。可以通过更改程序执行语句的顺序,通过插入任意跳转指令来更改控制图以及将树状条件构造转换为平面切换语句来执行编程中的控制流混淆。
类继承转换:通过对类设计结构以及类继承关系进行混淆,可以隐藏类的设计结构以及类之间的继承关系反映出来的程序设计思路,能有效达到抵抗攻击的目的。类继承转换方法主要有合并类、分割类以及类型隐藏等。类继承转换提高了程序的复杂度,给程序带来的额外开销也很小。
数据存储空间转换:对数据空间位置的随机化增加了攻击者获取有效信息的难度,可以避免设计者对数据以符合逻辑的方式存储给攻击者提供攻击的线索与资源。这类转换算法增加的复杂度较少,但抵抗攻击的能力很强,具有单向性,同时算法开销很小,通常与其他的混淆算法组合使用。
地址混淆:某些源代码混淆安全工具使用的这项技术会更改程序数据和代码的地址,从而导致不可预测性并使其难以利用。构建应用程序时,混淆算法会将内存中某些代码和数据的绝对位置以及不同数据项之间的相对距离随机化。这不仅减少了成功攻击的可能性,还意味着即使黑客在一个应用程序或设备上成功,他们也将无法在其他应用程序或设备上复制它,从而降低了对程序进行反向工程的好处。
混淆代码的定期更新:该技术通过定期发布经过混淆的软件的更新来主动防止攻击,从而阻止了黑客破解系统的企图。通过偶尔用新混淆的实例替换现有软件,攻击者被迫放弃其现有分析。最后,突破混淆安全性的努力超过了所获得的价值。
Objective-C消息调用和元数据混淆:源代码混淆工具(例如蛮犀安全的应用程序屏蔽解决方案)以两种方式混淆Objective-C代码。首先,它们混淆了源代码中包含的纯文本消息调用,以确保它们不易于阅读和编辑。其次,它们对一些Objective-C元数据进行加密,以从静态分析工具中隐藏敏感信息,例如类别,类,方法,协议,类属性和实例变量的名称,以及方法参数及其类型。仅在加载混淆的应用程序时,才在运行时解密加密的数据。